// redisCacheTest.js - Redis缓存功能测试脚本
const assert = require('assert');
const { initRedis, getCache, setCache, deleteCache, deleteCachePattern, incrementCounter } = require('../utils/redisUtil');

// 测试用例
async function runTests() {
  console.log('开始测试Redis缓存功能...');
  
  try {
    // 1. 初始化Redis连接
    console.log('测试1: 初始化Redis连接');
    await initRedis();
    console.log('✓ Redis连接成功');
    
    // 2. 测试基本的缓存设置和获取
    console.log('测试2: 基本缓存设置和获取');
    await setCache('test:key', { value: 'test value' }, 60);
    const cachedValue = await getCache('test:key');
    assert.deepStrictEqual(cachedValue, { value: 'test value' }, '缓存获取失败');
    console.log('✓ 基本缓存功能正常');
    
    // 3. 测试缓存过期
    console.log('测试3: 缓存过期机制');
    await setCache('test:expire', 'expire test', 1); // 1秒过期
    console.log('等待1.5秒让缓存过期...');
    await new Promise(resolve => setTimeout(resolve, 1500));
    const expiredValue = await getCache('test:expire');
    assert.strictEqual(expiredValue, null, '缓存应该已过期');
    console.log('✓ 缓存过期机制正常');
    
    // 4. 测试随机过期时间（防雪崩）
    console.log('测试4: 随机过期时间功能');
    const expireValues = [];
    for (let i = 0; i < 5; i++) {
      const key = `test:random:${i}`;
      await setCache(key, `value ${i}`, 300, true);
      // 注意：这里无法直接验证随机过期时间，只能通过日志确认功能调用
    }
    console.log('✓ 随机过期时间功能调用成功');
    
    // 5. 测试缓存删除
    console.log('测试5: 缓存删除功能');
    await setCache('test:delete', 'delete test', 60);
    await deleteCache('test:delete');
    const deletedValue = await getCache('test:delete');
    assert.strictEqual(deletedValue, null, '缓存应该已删除');
    console.log('✓ 缓存删除功能正常');
    
    // 6. 测试批量删除缓存
    console.log('测试6: 批量删除缓存功能');
    for (let i = 0; i < 3; i++) {
      await setCache(`test:pattern:${i}`, `pattern value ${i}`, 60);
    }
    await deleteCachePattern('test:pattern:*');
    for (let i = 0; i < 3; i++) {
      const value = await getCache(`test:pattern:${i}`);
      assert.strictEqual(value, null, `缓存 test:pattern:${i} 应该已删除`);
    }
    console.log('✓ 批量删除缓存功能正常');
    
    // 7. 测试计数器功能
    console.log('测试7: 计数器功能');
    const counterKey = 'test:counter';
    await deleteCache(counterKey); // 确保计数器从0开始
    const count1 = await incrementCounter(counterKey);
    assert.strictEqual(count1, 1, '计数器初始值应为1');
    const count2 = await incrementCounter(counterKey, 5);
    assert.strictEqual(count2, 6, '计数器增加值应为6');
    console.log('✓ 计数器功能正常');
    
    // 8. 测试空值缓存（防穿透）
    console.log('测试8: 空值缓存功能');
    await setCache('test:null', null, 60);
    const nullValue = await getCache('test:null');
    assert.strictEqual(nullValue, null, '空值缓存测试失败');
    console.log('✓ 空值缓存功能正常');
    
    // 9. 清理测试数据
    console.log('清理测试数据...');
    await deleteCachePattern('test:*');
    
    console.log('\n🎉 所有Redis缓存功能测试通过！');
  } catch (error) {
    console.error('\n❌ 测试失败:', error);
    process.exit(1);
  }
}

// 运行测试
runTests().then(() => {
  process.exit(0);
}).catch(error => {
  console.error('测试执行错误:', error);
  process.exit(1);
});